mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-28 12:11:08 -04:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
			fcd992179e
			...
			fix-logout
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bdf8fa8b5a | |||
| ba298cdb0a | |||
| 05d5ce26fd | |||
| 393fe20010 | |||
| 57bdbd2897 | |||
| 7447cc24f9 | |||
| 889d22d92c | |||
| bc8f2cd484 | |||
| 4e47f58bad | |||
| d8c429912e | |||
| 0aaf0e7e75 | |||
| 3d0b89bb4d | |||
| 38c4b9ebce | |||
| 7be59e78e0 | |||
| 204483836a | |||
| 33bc9ded65 | |||
| 4271ef451e | |||
| 6eb44fba93 | |||
| 96e7300583 | |||
| a479d966d1 | 
							
								
								
									
										161
									
								
								.github/workflows/uffizzi-build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								.github/workflows/uffizzi-build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,161 @@ | |||||||
|  | name: Build PR Image | ||||||
|  | on: | ||||||
|  |   pull_request: | ||||||
|  |     types: [opened,synchronize,reopened,closed] | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |  | ||||||
|  |   build-application: | ||||||
|  |     name: Build and Push `application` | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} | ||||||
|  |     outputs: | ||||||
|  |       tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout git repo | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |       - name: Generate UUID image name | ||||||
|  |         id: uuid | ||||||
|  |         run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV | ||||||
|  |       - name: Docker metadata | ||||||
|  |         id: meta | ||||||
|  |         uses: docker/metadata-action@v3 | ||||||
|  |         with: | ||||||
|  |           images: registry.uffizzi.com/${{ env.UUID_TAG_APP }} | ||||||
|  |           tags: type=raw,value=60d | ||||||
|  |       - name: Build and Push Image to registry.uffizzi.com ephemeral registry | ||||||
|  |         uses: docker/build-push-action@v2 | ||||||
|  |         with: | ||||||
|  |           push: true | ||||||
|  |           context: ./ | ||||||
|  |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|  |           file: ./uffizzi/Dockerfile | ||||||
|  |  | ||||||
|  |   build-nginx: | ||||||
|  |     needs:  | ||||||
|  |       - build-application | ||||||
|  |     name: Build and Push `nginx` | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} | ||||||
|  |     outputs: | ||||||
|  |       tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout git repo | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |       - name: Set up Docker Buildx | ||||||
|  |         uses: docker/setup-buildx-action@v2         | ||||||
|  |       - name: Generate UUID image name | ||||||
|  |         id: uuid | ||||||
|  |         run: echo "UUID_TAG_NGINX=$(uuidgen)" >> $GITHUB_ENV | ||||||
|  |       - name: Docker metadata | ||||||
|  |         id: meta | ||||||
|  |         uses: docker/metadata-action@v3 | ||||||
|  |         with: | ||||||
|  |           images: registry.uffizzi.com/${{ env.UUID_TAG_NGINX }} | ||||||
|  |           tags: type=raw,value=60d | ||||||
|  |       - name: Build and Push Image to Uffizzi ephemeral registry | ||||||
|  |         uses: docker/build-push-action@v2 | ||||||
|  |         with: | ||||||
|  |           push: true | ||||||
|  |           context: ./ | ||||||
|  |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|  |           file: ./uffizzi/nginx/Dockerfile | ||||||
|  |           build-args: | | ||||||
|  |             BASE_IMAGE=${{ needs.build-application.outputs.tags }} | ||||||
|  |           cache-from: type=gha | ||||||
|  |           cache-to: type=gha,mode=max | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   build-crond: | ||||||
|  |     name: Build and Push `crond` | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} | ||||||
|  |     outputs: | ||||||
|  |       tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout git repo | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |       - name: Set up Docker Buildx | ||||||
|  |         uses: docker/setup-buildx-action@v2         | ||||||
|  |       - name: Generate UUID image name | ||||||
|  |         id: uuid | ||||||
|  |         run: echo "UUID_TAG_CROND=$(uuidgen)" >> $GITHUB_ENV | ||||||
|  |       - name: Docker metadata | ||||||
|  |         id: meta | ||||||
|  |         uses: docker/metadata-action@v3 | ||||||
|  |         with: | ||||||
|  |           images: registry.uffizzi.com/${{ env.UUID_TAG_CROND }} | ||||||
|  |           tags: type=raw,value=60d | ||||||
|  |       - name: Build and Push Image to registry.uffizzi.com ephemeral registry | ||||||
|  |         uses: docker/build-push-action@v2 | ||||||
|  |         with: | ||||||
|  |           push: true | ||||||
|  |           context: ./ | ||||||
|  |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|  |           file: ./uffizzi/crond/Dockerfile       | ||||||
|  |           cache-from: type=gha | ||||||
|  |           cache-to: type=gha,mode=max | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   render-compose-file: | ||||||
|  |     name: Render Docker Compose File | ||||||
|  |     # Pass output of this workflow to another triggered by `workflow_run` event. | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     outputs: | ||||||
|  |       compose-file-cache-key: ${{ steps.hash.outputs.hash }} | ||||||
|  |     needs:  | ||||||
|  |       - build-application | ||||||
|  |       - build-nginx | ||||||
|  |       - build-crond | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout git repo | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |       - name: Render Compose File | ||||||
|  |         run: | | ||||||
|  |           APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }}) | ||||||
|  |           export APP_IMAGE | ||||||
|  |           NGINX_IMAGE=$(echo ${{ needs.build-nginx.outputs.tags }}) | ||||||
|  |           export NGINX_IMAGE | ||||||
|  |           CROND_IMAGE=$(echo ${{ needs.build-crond.outputs.tags }}) | ||||||
|  |           export CROND_IMAGE | ||||||
|  |           # Render simple template from environment variables. | ||||||
|  |           envsubst < ./uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml | ||||||
|  |           cat docker-compose.rendered.yml | ||||||
|  |       - name: Upload Rendered Compose File as Artifact | ||||||
|  |         uses: actions/upload-artifact@v3 | ||||||
|  |         with: | ||||||
|  |           name: preview-spec | ||||||
|  |           path: docker-compose.rendered.yml | ||||||
|  |           retention-days: 2 | ||||||
|  |       - name: Serialize PR Event to File | ||||||
|  |         run:  | | ||||||
|  |           cat << EOF > event.json | ||||||
|  |           ${{ toJSON(github.event) }}  | ||||||
|  |            | ||||||
|  |           EOF | ||||||
|  |       - name: Upload PR Event as Artifact | ||||||
|  |         uses: actions/upload-artifact@v3 | ||||||
|  |         with: | ||||||
|  |           name: preview-spec | ||||||
|  |           path: event.json | ||||||
|  |           retention-days: 2 | ||||||
|  |  | ||||||
|  |   delete-preview: | ||||||
|  |     name: Call for Preview Deletion | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ github.event.action == 'closed' }} | ||||||
|  |     steps: | ||||||
|  |       # If this PR is closing, we will not render a compose file nor pass it to the next workflow. | ||||||
|  |       - name: Serialize PR Event to File | ||||||
|  |         run: echo '${{ toJSON(github.event) }}' > event.json | ||||||
|  |       - name: Upload PR Event as Artifact | ||||||
|  |         uses: actions/upload-artifact@v3 | ||||||
|  |         with: | ||||||
|  |           name: preview-spec | ||||||
|  |           path: event.json | ||||||
|  |           retention-days: 2 | ||||||
|  |  | ||||||
							
								
								
									
										84
									
								
								.github/workflows/uffizzi-preview.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								.github/workflows/uffizzi-preview.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | |||||||
|  | name: Deploy Uffizzi Preview | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   workflow_run: | ||||||
|  |     workflows: | ||||||
|  |       - "Build PR Image" | ||||||
|  |     types: | ||||||
|  |       - completed | ||||||
|  |  | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   cache-compose-file: | ||||||
|  |     name: Cache Compose File | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     outputs: | ||||||
|  |       compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }} | ||||||
|  |       pr-number: ${{ env.PR_NUMBER }} | ||||||
|  |     steps: | ||||||
|  |       - name: 'Download artifacts' | ||||||
|  |         # Fetch output (zip archive) from the workflow run that triggered this workflow. | ||||||
|  |         uses: actions/github-script@v6 | ||||||
|  |         with: | ||||||
|  |           script: | | ||||||
|  |             let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ | ||||||
|  |                owner: context.repo.owner, | ||||||
|  |                repo: context.repo.repo, | ||||||
|  |                run_id: context.payload.workflow_run.id, | ||||||
|  |             }); | ||||||
|  |             let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { | ||||||
|  |               return artifact.name == "preview-spec" | ||||||
|  |             })[0]; | ||||||
|  |             let download = await github.rest.actions.downloadArtifact({ | ||||||
|  |                owner: context.repo.owner, | ||||||
|  |                repo: context.repo.repo, | ||||||
|  |                artifact_id: matchArtifact.id, | ||||||
|  |                archive_format: 'zip', | ||||||
|  |             }); | ||||||
|  |             let fs = require('fs'); | ||||||
|  |             fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data)); | ||||||
|  |       - name: 'Unzip artifact' | ||||||
|  |         run: unzip preview-spec.zip | ||||||
|  |       - name: Read Event into ENV | ||||||
|  |         run: | | ||||||
|  |           echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV | ||||||
|  |           cat event.json >> $GITHUB_ENV | ||||||
|  |           echo 'EOF' >> $GITHUB_ENV | ||||||
|  |       - name: Hash Rendered Compose File | ||||||
|  |         id: hash | ||||||
|  |         # If the previous workflow was triggered by a PR close event, we will not have a compose file artifact. | ||||||
|  |         if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} | ||||||
|  |         run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV | ||||||
|  |       - name: Cache Rendered Compose File | ||||||
|  |         if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} | ||||||
|  |         uses: actions/cache@v3 | ||||||
|  |         with: | ||||||
|  |           path: docker-compose.rendered.yml | ||||||
|  |           key: ${{ env.COMPOSE_FILE_HASH }} | ||||||
|  |  | ||||||
|  |       - name: Read PR Number From Event Object | ||||||
|  |         id: pr | ||||||
|  |         run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV | ||||||
|  |  | ||||||
|  |       - name: DEBUG - Print Job Outputs | ||||||
|  |         if: ${{ runner.debug }} | ||||||
|  |         run: | | ||||||
|  |           echo "PR number: ${{ env.PR_NUMBER }}" | ||||||
|  |           echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}" | ||||||
|  |           cat event.json | ||||||
|  |   deploy-uffizzi-preview: | ||||||
|  |     name: Use Remote Workflow to Preview on Uffizzi | ||||||
|  |     needs: | ||||||
|  |       - cache-compose-file | ||||||
|  |     uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1 | ||||||
|  |     with: | ||||||
|  |       # If this workflow was triggered by a PR close event, cache-key will be an empty string | ||||||
|  |       # and this reusable workflow will delete the preview deployment. | ||||||
|  |       compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }} | ||||||
|  |       compose-file-cache-path: docker-compose.rendered.yml | ||||||
|  |       server: https://app.uffizzi.com/ | ||||||
|  |       pr-number: ${{ needs.cache-compose-file.outputs.pr-number }} | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       pull-requests: write | ||||||
|  |       id-token: write | ||||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -16,3 +16,5 @@ Homestead.yaml | |||||||
| .gitkeep | .gitkeep | ||||||
| /public/docs | /public/docs | ||||||
| /.scribe | /.scribe | ||||||
|  | !storage/fonts/.gitkeep | ||||||
|  | .DS_Store | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| FROM php:7.4-fpm | FROM php:8.1-fpm | ||||||
|  |  | ||||||
| # Arguments defined in docker-compose.yml | # Arguments defined in docker-compose.yml | ||||||
| ARG user | ARG user | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ class CreateTemplateCommand extends Command | |||||||
|         copy(public_path("/build/img/PDF/{$type}1.png"), public_path("/build/img/PDF/{$templateName}.png")); |         copy(public_path("/build/img/PDF/{$type}1.png"), public_path("/build/img/PDF/{$templateName}.png")); | ||||||
|         copy(resource_path("/static/img/PDF/{$type}1.png"), resource_path("/static/img/PDF/{$templateName}.png")); |         copy(resource_path("/static/img/PDF/{$type}1.png"), resource_path("/static/img/PDF/{$templateName}.png")); | ||||||
|  |  | ||||||
|         $path = resource_path("app/pdf/{$type}/{$templateName}.blade.php"); |         $path = resource_path("views/app/pdf/{$type}/{$templateName}.blade.php"); | ||||||
|         $type = ucfirst($type); |         $type = ucfirst($type); | ||||||
|         $this->info("{$type} Template created successfully at ".$path); |         $this->info("{$type} Template created successfully at ".$path); | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,24 +2,25 @@ | |||||||
|  |  | ||||||
| namespace Crater\Http\Controllers\V1\Admin\Report; | namespace Crater\Http\Controllers\V1\Admin\Report; | ||||||
|  |  | ||||||
|  | use PDF; | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use Crater\Http\Controllers\Controller; |  | ||||||
| use Crater\Models\Company; | use Crater\Models\Company; | ||||||
| use Crater\Models\CompanySetting; | use Crater\Models\Currency; | ||||||
| use Crater\Models\Customer; | use Crater\Models\Customer; | ||||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||||
|  | use Crater\Models\CompanySetting; | ||||||
| use Illuminate\Support\Facades\App; | use Illuminate\Support\Facades\App; | ||||||
| use PDF; | use Crater\Http\Controllers\Controller; | ||||||
|  |  | ||||||
| class CustomerSalesReportController extends Controller | class CustomerSalesReportController extends Controller | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|     * Handle the incoming request. |      * Handle the incoming request. | ||||||
|     * |      * | ||||||
|     * @param  \Illuminate\Http\Request  $request |      * @param  \Illuminate\Http\Request  $request | ||||||
|     * @param  string  $hash |      * @param  string  $hash | ||||||
|     * @return \Illuminate\Http\JsonResponse |      * @return \Illuminate\Http\JsonResponse | ||||||
|     */ |      */ | ||||||
|     public function __invoke(Request $request, $hash) |     public function __invoke(Request $request, $hash) | ||||||
|     { |     { | ||||||
|         $company = Company::where('unique_hash', $hash)->first(); |         $company = Company::where('unique_hash', $hash)->first(); | ||||||
| @ -56,6 +57,7 @@ class CustomerSalesReportController extends Controller | |||||||
|         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); |         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); | ||||||
|         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); |         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); | ||||||
|         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); |         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); | ||||||
|  |         $currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id)); | ||||||
|  |  | ||||||
|         $colors = [ |         $colors = [ | ||||||
|             'primary_text_color', |             'primary_text_color', | ||||||
| @ -80,6 +82,7 @@ class CustomerSalesReportController extends Controller | |||||||
|             'company' => $company, |             'company' => $company, | ||||||
|             'from_date' => $from_date, |             'from_date' => $from_date, | ||||||
|             'to_date' => $to_date, |             'to_date' => $to_date, | ||||||
|  |             'currency' => $currency, | ||||||
|         ]); |         ]); | ||||||
|  |  | ||||||
|         $pdf = PDF::loadView('app.pdf.reports.sales-customers'); |         $pdf = PDF::loadView('app.pdf.reports.sales-customers'); | ||||||
|  | |||||||
| @ -2,24 +2,25 @@ | |||||||
|  |  | ||||||
| namespace Crater\Http\Controllers\V1\Admin\Report; | namespace Crater\Http\Controllers\V1\Admin\Report; | ||||||
|  |  | ||||||
| use Carbon\Carbon; |  | ||||||
| use Crater\Http\Controllers\Controller; |  | ||||||
| use Crater\Models\Company; |  | ||||||
| use Crater\Models\CompanySetting; |  | ||||||
| use Crater\Models\Expense; |  | ||||||
| use Illuminate\Http\Request; |  | ||||||
| use Illuminate\Support\Facades\App; |  | ||||||
| use PDF; | use PDF; | ||||||
|  | use Carbon\Carbon; | ||||||
|  | use Crater\Models\Company; | ||||||
|  | use Crater\Models\Expense; | ||||||
|  | use Crater\Models\Currency; | ||||||
|  | use Illuminate\Http\Request; | ||||||
|  | use Crater\Models\CompanySetting; | ||||||
|  | use Illuminate\Support\Facades\App; | ||||||
|  | use Crater\Http\Controllers\Controller; | ||||||
|  |  | ||||||
| class ExpensesReportController extends Controller | class ExpensesReportController extends Controller | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|     * Handle the incoming request. |      * Handle the incoming request. | ||||||
|     * |      * | ||||||
|     * @param  \Illuminate\Http\Request  $request |      * @param  \Illuminate\Http\Request  $request | ||||||
|     * @param  string  $hash |      * @param  string  $hash | ||||||
|     * @return \Illuminate\Http\JsonResponse |      * @return \Illuminate\Http\JsonResponse | ||||||
|     */ |      */ | ||||||
|     public function __invoke(Request $request, $hash) |     public function __invoke(Request $request, $hash) | ||||||
|     { |     { | ||||||
|         $company = Company::where('unique_hash', $hash)->first(); |         $company = Company::where('unique_hash', $hash)->first(); | ||||||
| @ -43,6 +44,7 @@ class ExpensesReportController extends Controller | |||||||
|         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); |         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); | ||||||
|         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); |         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); | ||||||
|         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); |         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); | ||||||
|  |         $currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id)); | ||||||
|  |  | ||||||
|         $colors = [ |         $colors = [ | ||||||
|             'primary_text_color', |             'primary_text_color', | ||||||
| @ -66,6 +68,7 @@ class ExpensesReportController extends Controller | |||||||
|             'company' => $company, |             'company' => $company, | ||||||
|             'from_date' => $from_date, |             'from_date' => $from_date, | ||||||
|             'to_date' => $to_date, |             'to_date' => $to_date, | ||||||
|  |             'currency' => $currency, | ||||||
|         ]); |         ]); | ||||||
|         $pdf = PDF::loadView('app.pdf.reports.expenses'); |         $pdf = PDF::loadView('app.pdf.reports.expenses'); | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,24 +2,25 @@ | |||||||
|  |  | ||||||
| namespace Crater\Http\Controllers\V1\Admin\Report; | namespace Crater\Http\Controllers\V1\Admin\Report; | ||||||
|  |  | ||||||
| use Carbon\Carbon; |  | ||||||
| use Crater\Http\Controllers\Controller; |  | ||||||
| use Crater\Models\Company; |  | ||||||
| use Crater\Models\CompanySetting; |  | ||||||
| use Crater\Models\InvoiceItem; |  | ||||||
| use Illuminate\Http\Request; |  | ||||||
| use Illuminate\Support\Facades\App; |  | ||||||
| use PDF; | use PDF; | ||||||
|  | use Carbon\Carbon; | ||||||
|  | use Crater\Models\Company; | ||||||
|  | use Crater\Models\Currency; | ||||||
|  | use Illuminate\Http\Request; | ||||||
|  | use Crater\Models\InvoiceItem; | ||||||
|  | use Crater\Models\CompanySetting; | ||||||
|  | use Illuminate\Support\Facades\App; | ||||||
|  | use Crater\Http\Controllers\Controller; | ||||||
|  |  | ||||||
| class ItemSalesReportController extends Controller | class ItemSalesReportController extends Controller | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|     * Handle the incoming request. |      * Handle the incoming request. | ||||||
|     * |      * | ||||||
|     * @param  \Illuminate\Http\Request  $request |      * @param  \Illuminate\Http\Request  $request | ||||||
|     * @param  string  $hash |      * @param  string  $hash | ||||||
|     * @return \Illuminate\Http\JsonResponse |      * @return \Illuminate\Http\JsonResponse | ||||||
|     */ |      */ | ||||||
|     public function __invoke(Request $request, $hash) |     public function __invoke(Request $request, $hash) | ||||||
|     { |     { | ||||||
|         $company = Company::where('unique_hash', $hash)->first(); |         $company = Company::where('unique_hash', $hash)->first(); | ||||||
| @ -43,6 +44,7 @@ class ItemSalesReportController extends Controller | |||||||
|         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); |         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); | ||||||
|         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); |         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); | ||||||
|         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); |         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); | ||||||
|  |         $currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id)); | ||||||
|  |  | ||||||
|         $colors = [ |         $colors = [ | ||||||
|             'primary_text_color', |             'primary_text_color', | ||||||
| @ -66,6 +68,7 @@ class ItemSalesReportController extends Controller | |||||||
|             'company' => $company, |             'company' => $company, | ||||||
|             'from_date' => $from_date, |             'from_date' => $from_date, | ||||||
|             'to_date' => $to_date, |             'to_date' => $to_date, | ||||||
|  |             'currency' => $currency, | ||||||
|         ]); |         ]); | ||||||
|         $pdf = PDF::loadView('app.pdf.reports.sales-items'); |         $pdf = PDF::loadView('app.pdf.reports.sales-items'); | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,25 +2,26 @@ | |||||||
|  |  | ||||||
| namespace Crater\Http\Controllers\V1\Admin\Report; | namespace Crater\Http\Controllers\V1\Admin\Report; | ||||||
|  |  | ||||||
|  | use PDF; | ||||||
| use Carbon\Carbon; | use Carbon\Carbon; | ||||||
| use Crater\Http\Controllers\Controller; |  | ||||||
| use Crater\Models\Company; | use Crater\Models\Company; | ||||||
| use Crater\Models\CompanySetting; |  | ||||||
| use Crater\Models\Expense; | use Crater\Models\Expense; | ||||||
| use Crater\Models\Payment; | use Crater\Models\Payment; | ||||||
|  | use Crater\Models\Currency; | ||||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||||
|  | use Crater\Models\CompanySetting; | ||||||
| use Illuminate\Support\Facades\App; | use Illuminate\Support\Facades\App; | ||||||
| use PDF; | use Crater\Http\Controllers\Controller; | ||||||
|  |  | ||||||
| class ProfitLossReportController extends Controller | class ProfitLossReportController extends Controller | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|     * Handle the incoming request. |      * Handle the incoming request. | ||||||
|     * |      * | ||||||
|     * @param  \Illuminate\Http\Request  $request |      * @param  \Illuminate\Http\Request  $request | ||||||
|     * @param  string  $hash |      * @param  string  $hash | ||||||
|     * @return \Illuminate\Http\JsonResponse |      * @return \Illuminate\Http\JsonResponse | ||||||
|     */ |      */ | ||||||
|     public function __invoke(Request $request, $hash) |     public function __invoke(Request $request, $hash) | ||||||
|     { |     { | ||||||
|         $company = Company::where('unique_hash', $hash)->first(); |         $company = Company::where('unique_hash', $hash)->first(); | ||||||
| @ -49,6 +50,8 @@ class ProfitLossReportController extends Controller | |||||||
|         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); |         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); | ||||||
|         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); |         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); | ||||||
|         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); |         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); | ||||||
|  |         $currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id)); | ||||||
|  |  | ||||||
|  |  | ||||||
|         $colors = [ |         $colors = [ | ||||||
|             'primary_text_color', |             'primary_text_color', | ||||||
| @ -74,6 +77,7 @@ class ProfitLossReportController extends Controller | |||||||
|             'company' => $company, |             'company' => $company, | ||||||
|             'from_date' => $from_date, |             'from_date' => $from_date, | ||||||
|             'to_date' => $to_date, |             'to_date' => $to_date, | ||||||
|  |             'currency' => $currency, | ||||||
|         ]); |         ]); | ||||||
|         $pdf = PDF::loadView('app.pdf.reports.profit-loss'); |         $pdf = PDF::loadView('app.pdf.reports.profit-loss'); | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,24 +2,25 @@ | |||||||
|  |  | ||||||
| namespace Crater\Http\Controllers\V1\Admin\Report; | namespace Crater\Http\Controllers\V1\Admin\Report; | ||||||
|  |  | ||||||
| use Carbon\Carbon; |  | ||||||
| use Crater\Http\Controllers\Controller; |  | ||||||
| use Crater\Models\Company; |  | ||||||
| use Crater\Models\CompanySetting; |  | ||||||
| use Crater\Models\Tax; |  | ||||||
| use Illuminate\Http\Request; |  | ||||||
| use Illuminate\Support\Facades\App; |  | ||||||
| use PDF; | use PDF; | ||||||
|  | use Carbon\Carbon; | ||||||
|  | use Crater\Models\Tax; | ||||||
|  | use Crater\Models\Company; | ||||||
|  | use Crater\Models\Currency; | ||||||
|  | use Illuminate\Http\Request; | ||||||
|  | use Crater\Models\CompanySetting; | ||||||
|  | use Illuminate\Support\Facades\App; | ||||||
|  | use Crater\Http\Controllers\Controller; | ||||||
|  |  | ||||||
| class TaxSummaryReportController extends Controller | class TaxSummaryReportController extends Controller | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|     * Handle the incoming request. |      * Handle the incoming request. | ||||||
|     * |      * | ||||||
|     * @param  \Illuminate\Http\Request  $request |      * @param  \Illuminate\Http\Request  $request | ||||||
|     * @param  string  $hash |      * @param  string  $hash | ||||||
|     * @return \Illuminate\Http\JsonResponse |      * @return \Illuminate\Http\JsonResponse | ||||||
|     */ |      */ | ||||||
|     public function __invoke(Request $request, $hash) |     public function __invoke(Request $request, $hash) | ||||||
|     { |     { | ||||||
|         $company = Company::where('unique_hash', $hash)->first(); |         $company = Company::where('unique_hash', $hash)->first(); | ||||||
| @ -44,6 +45,8 @@ class TaxSummaryReportController extends Controller | |||||||
|         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); |         $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); | ||||||
|         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); |         $from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat); | ||||||
|         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); |         $to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat); | ||||||
|  |         $currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id)); | ||||||
|  |  | ||||||
|  |  | ||||||
|         $colors = [ |         $colors = [ | ||||||
|             'primary_text_color', |             'primary_text_color', | ||||||
| @ -68,6 +71,7 @@ class TaxSummaryReportController extends Controller | |||||||
|             'company' => $company, |             'company' => $company, | ||||||
|             'from_date' => $from_date, |             'from_date' => $from_date, | ||||||
|             'to_date' => $to_date, |             'to_date' => $to_date, | ||||||
|  |             'currency' => $currency, | ||||||
|         ]); |         ]); | ||||||
|  |  | ||||||
|         $pdf = PDF::loadView('app.pdf.reports.tax-summary'); |         $pdf = PDF::loadView('app.pdf.reports.tax-summary'); | ||||||
|  | |||||||
| @ -38,15 +38,15 @@ | |||||||
|     "barryvdh/laravel-ide-helper": "^2.6", |     "barryvdh/laravel-ide-helper": "^2.6", | ||||||
|     "beyondcode/laravel-dump-server": "^1.0", |     "beyondcode/laravel-dump-server": "^1.0", | ||||||
|     "facade/ignition": "^2.3.6", |     "facade/ignition": "^2.3.6", | ||||||
|     "friendsofphp/php-cs-fixer": "^3.0", |     "friendsofphp/php-cs-fixer": "^3.8", | ||||||
|     "fzaninotto/faker": "^1.9.1", |     "fakerphp/faker": "^1.9.1", | ||||||
|     "mockery/mockery": "^1.3.1", |     "mockery/mockery": "^1.3.1", | ||||||
|     "nunomaduro/collision": "^5.0", |     "nunomaduro/collision": "^5.0", | ||||||
|     "pestphp/pest": "^1.0", |     "pestphp/pest": "^1.0", | ||||||
|     "pestphp/pest-plugin-faker": "^1.0", |     "pestphp/pest-plugin-faker": "^1.0", | ||||||
|     "pestphp/pest-plugin-laravel": "^1.0", |     "pestphp/pest-plugin-laravel": "^1.0", | ||||||
|     "pestphp/pest-plugin-parallel": "^0.2.1", |     "pestphp/pest-plugin-parallel": "^0.2.1", | ||||||
|     "phpunit/phpunit": "^9.0" |     "phpunit/phpunit": "^9.3" | ||||||
|   }, |   }, | ||||||
|   "autoload": { |   "autoload": { | ||||||
|     "psr-4": { |     "psr-4": { | ||||||
| @ -81,7 +81,10 @@ | |||||||
|   "config": { |   "config": { | ||||||
|     "optimize-autoloader": true, |     "optimize-autoloader": true, | ||||||
|     "preferred-install": "dist", |     "preferred-install": "dist", | ||||||
|     "sort-packages": true |     "sort-packages": true, | ||||||
|  |     "allow-plugins": { | ||||||
|  |       "pestphp/pest-plugin": true | ||||||
|  |     } | ||||||
|   }, |   }, | ||||||
|   "extra": { |   "extra": { | ||||||
|     "laravel": { |     "laravel": { | ||||||
|  | |||||||
							
								
								
									
										2347
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2347
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -71,6 +71,7 @@ return [ | |||||||
|         ["code" => "cs", "name" => "Czech"], |         ["code" => "cs", "name" => "Czech"], | ||||||
|         ["code" => "el", "name" => "Greek"], |         ["code" => "el", "name" => "Greek"], | ||||||
|         ["code" => "hr", "name" => "Crotian"], |         ["code" => "hr", "name" => "Crotian"], | ||||||
|  |         ["code" => "th", "name" => "ไทย"], | ||||||
|     ], |     ], | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ return [ | |||||||
|             'tokenizer', |             'tokenizer', | ||||||
|             'JSON', |             'JSON', | ||||||
|             'cURL', |             'cURL', | ||||||
|  |             'zip', | ||||||
|         ], |         ], | ||||||
|         'apache' => [ |         'apache' => [ | ||||||
|             'mod_rewrite', |             'mod_rewrite', | ||||||
|  | |||||||
| @ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder | |||||||
|         ['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674], |         ['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674], | ||||||
|         ['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977], |         ['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977], | ||||||
|         ['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599], |         ['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599], | ||||||
|         ['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31], |         ['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31], | ||||||
|         ['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687], |         ['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687], | ||||||
|         ['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64], |         ['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64], | ||||||
|         ['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505], |         ['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505], | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| FROM php:7.4-fpm-alpine | FROM php:8.0-fpm-alpine | ||||||
|  |  | ||||||
| RUN apk add --no-cache \ | RUN apk add --no-cache \ | ||||||
|     php7-bcmath |     php8-bcmath | ||||||
|  |  | ||||||
| RUN docker-php-ext-install pdo pdo_mysql bcmath | RUN docker-php-ext-install pdo pdo_mysql bcmath | ||||||
|  |  | ||||||
|  | |||||||
| @ -17,18 +17,7 @@ | |||||||
|             <td class="px-5 py-4 text-left align-top"> |             <td class="px-5 py-4 text-left align-top"> | ||||||
|               <div class="flex justify-start"> |               <div class="flex justify-start"> | ||||||
|                 <div |                 <div | ||||||
|                   class=" |                   class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move  handle" | ||||||
|                     flex |  | ||||||
|                     items-center |  | ||||||
|                     justify-center |  | ||||||
|                     w-5 |  | ||||||
|                     h-5 |  | ||||||
|                     mt-2 |  | ||||||
|                     text-gray-300 |  | ||||||
|                     cursor-move |  | ||||||
|                     handle |  | ||||||
|                     mr-2 |  | ||||||
|                   " |  | ||||||
|                 > |                 > | ||||||
|                   <DragIcon /> |                   <DragIcon /> | ||||||
|                 </div> |                 </div> | ||||||
| @ -108,7 +97,7 @@ | |||||||
|  |  | ||||||
|                           <BaseIcon |                           <BaseIcon | ||||||
|                             name="ChevronDownIcon" |                             name="ChevronDownIcon" | ||||||
|                             class="w-4 h-4 text-gray-500 ml-1" |                             class="w-4 h-4 ml-1 text-gray-500" | ||||||
|                           /> |                           /> | ||||||
|                         </span> |                         </span> | ||||||
|                       </BaseButton> |                       </BaseButton> | ||||||
| @ -155,7 +144,7 @@ | |||||||
|               <BaseContentPlaceholders v-if="loading"> |               <BaseContentPlaceholders v-if="loading"> | ||||||
|                 <BaseContentPlaceholdersText |                 <BaseContentPlaceholdersText | ||||||
|                   :lines="1" |                   :lines="1" | ||||||
|                   class="w-24 h-8 rounded-md border" |                   class="w-24 h-8 border rounded-md" | ||||||
|                 /> |                 /> | ||||||
|               </BaseContentPlaceholders> |               </BaseContentPlaceholders> | ||||||
|  |  | ||||||
| @ -175,6 +164,7 @@ | |||||||
|                 :ability="abilities.CREATE_INVOICE" |                 :ability="abilities.CREATE_INVOICE" | ||||||
|                 :store="store" |                 :store="store" | ||||||
|                 :store-prop="storeProp" |                 :store-prop="storeProp" | ||||||
|  |                 :discount="discount" | ||||||
|                 @update="updateTax" |                 @update="updateTax" | ||||||
|               /> |               /> | ||||||
|             </td> |             </td> | ||||||
|  | |||||||
| @ -30,24 +30,13 @@ | |||||||
|         <template v-if="userStore.hasAbilities(ability)" #action> |         <template v-if="userStore.hasAbilities(ability)" #action> | ||||||
|           <button |           <button | ||||||
|             type="button" |             type="button" | ||||||
|             class=" |             class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer " | ||||||
|               flex |  | ||||||
|               items-center |  | ||||||
|               justify-center |  | ||||||
|               w-full |  | ||||||
|               px-2 |  | ||||||
|               cursor-pointer |  | ||||||
|               py-2 |  | ||||||
|               bg-gray-200 |  | ||||||
|               border-none |  | ||||||
|               outline-none |  | ||||||
|             " |  | ||||||
|             @click="openTaxModal" |             @click="openTaxModal" | ||||||
|           > |           > | ||||||
|             <BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" /> |             <BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" /> | ||||||
|  |  | ||||||
|             <label |             <label | ||||||
|               class="ml-2 text-sm leading-none text-primary-400 cursor-pointer" |               class="ml-2 text-sm leading-none cursor-pointer text-primary-400" | ||||||
|               >{{ $t('invoices.add_new_tax') }}</label |               >{{ $t('invoices.add_new_tax') }}</label | ||||||
|             > |             > | ||||||
|           </button> |           </button> | ||||||
| @ -115,6 +104,10 @@ const props = defineProps({ | |||||||
|     type: Number, |     type: Number, | ||||||
|     default: 0, |     default: 0, | ||||||
|   }, |   }, | ||||||
|  |   discountedTotal: { | ||||||
|  |     type: Number, | ||||||
|  |     default: 0, | ||||||
|  |   }, | ||||||
|   currency: { |   currency: { | ||||||
|     type: [Object, String], |     type: [Object, String], | ||||||
|     required: true, |     required: true, | ||||||
| @ -153,19 +146,19 @@ const filteredTypes = computed(() => { | |||||||
| }) | }) | ||||||
|  |  | ||||||
| const taxAmount = computed(() => { | const taxAmount = computed(() => { | ||||||
|   if (localTax.compound_tax && props.total) { |   if (localTax.compound_tax && props.discountedTotal) { | ||||||
|     return ((props.total + props.totalTax) * localTax.percent) / 100 |     return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100 | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (props.total && localTax.percent) { |   if (props.discountedTotal && localTax.percent) { | ||||||
|     return (props.total * localTax.percent) / 100 |     return (props.discountedTotal * localTax.percent) / 100 | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return 0 |   return 0 | ||||||
| }) | }) | ||||||
|  |  | ||||||
| watch( | watch( | ||||||
|   () => props.total, |   () => props.discountedTotal, | ||||||
|   () => { |   () => { | ||||||
|     updateRowTax() |     updateRowTax() | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -29,14 +29,7 @@ | |||||||
|  |  | ||||||
|       <label |       <label | ||||||
|         v-else |         v-else | ||||||
|         class=" |         class="flex items-center justify-center m-0 text-lg text-black uppercase " | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-center |  | ||||||
|           m-0 |  | ||||||
|           text-lg text-black |  | ||||||
|           uppercase |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <BaseFormatMoney |         <BaseFormatMoney | ||||||
|           :amount="store.getSubTotal" |           :amount="store.getSubTotal" | ||||||
| @ -66,14 +59,7 @@ | |||||||
|  |  | ||||||
|       <label |       <label | ||||||
|         v-else-if="store[storeProp].tax_per_item === 'YES'" |         v-else-if="store[storeProp].tax_per_item === 'YES'" | ||||||
|         class=" |         class="flex items-center justify-center m-0 text-lg text-black uppercase " | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-center |  | ||||||
|           m-0 |  | ||||||
|           text-lg text-black |  | ||||||
|           uppercase |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" /> |         <BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" /> | ||||||
|       </label> |       </label> | ||||||
| @ -98,7 +84,7 @@ | |||||||
|       <BaseContentPlaceholders v-if="isLoading"> |       <BaseContentPlaceholders v-if="isLoading"> | ||||||
|         <BaseContentPlaceholdersText |         <BaseContentPlaceholdersText | ||||||
|           :lines="1" |           :lines="1" | ||||||
|           class="w-24 h-8 rounded-md border" |           class="w-24 h-8 border rounded-md" | ||||||
|         /> |         /> | ||||||
|       </BaseContentPlaceholders> |       </BaseContentPlaceholders> | ||||||
|       <div v-else class="flex" style="width: 140px" role="group"> |       <div v-else class="flex" style="width: 140px" role="group"> | ||||||
| @ -114,7 +100,7 @@ | |||||||
|         <BaseDropdown position="bottom-end"> |         <BaseDropdown position="bottom-end"> | ||||||
|           <template #activator> |           <template #activator> | ||||||
|             <BaseButton |             <BaseButton | ||||||
|               class="rounded-tr-md rounded-br-md p-2 rounded-none" |               class="p-2 rounded-none rounded-tr-md rounded-br-md" | ||||||
|               type="button" |               type="button" | ||||||
|               variant="white" |               variant="white" | ||||||
|             > |             > | ||||||
| @ -127,7 +113,7 @@ | |||||||
|  |  | ||||||
|                 <BaseIcon |                 <BaseIcon | ||||||
|                   name="ChevronDownIcon" |                   name="ChevronDownIcon" | ||||||
|                   class="w-4 h-4 text-gray-500 ml-1" |                   class="w-4 h-4 ml-1 text-gray-500" | ||||||
|                 /> |                 /> | ||||||
|               </span> |               </span> | ||||||
|             </BaseButton> |             </BaseButton> | ||||||
| @ -180,15 +166,7 @@ | |||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <div |     <div | ||||||
|       class=" |       class="flex items-center justify-between w-full pt-2 mt-5 border-t border-gray-200 border-solid " | ||||||
|         flex |  | ||||||
|         items-center |  | ||||||
|         justify-between |  | ||||||
|         w-full |  | ||||||
|         pt-2 |  | ||||||
|         mt-5 |  | ||||||
|         border-t border-gray-200 border-solid |  | ||||||
|       " |  | ||||||
|     > |     > | ||||||
|       <BaseContentPlaceholders v-if="isLoading"> |       <BaseContentPlaceholders v-if="isLoading"> | ||||||
|         <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> |         <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> | ||||||
| @ -204,14 +182,7 @@ | |||||||
|       </BaseContentPlaceholders> |       </BaseContentPlaceholders> | ||||||
|       <label |       <label | ||||||
|         v-else |         v-else | ||||||
|         class=" |         class="flex items-center justify-center text-lg uppercase  text-primary-400" | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-center |  | ||||||
|           text-lg |  | ||||||
|           uppercase |  | ||||||
|           text-primary-400 |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" /> |         <BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" /> | ||||||
|       </label> |       </label> | ||||||
| @ -334,6 +305,7 @@ function selectPercentage() { | |||||||
|  |  | ||||||
| function onSelectTax(selectedTax) { | function onSelectTax(selectedTax) { | ||||||
|   let amount = 0 |   let amount = 0 | ||||||
|  |  | ||||||
|   if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) { |   if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) { | ||||||
|     amount = Math.round( |     amount = Math.round( | ||||||
|       ((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) * |       ((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) * | ||||||
|  | |||||||
| @ -143,7 +143,7 @@ | |||||||
|           <template #activator> |           <template #activator> | ||||||
|             <img |             <img | ||||||
|               :src="previewAvatar" |               :src="previewAvatar" | ||||||
|               class="block w-8 h-8 rounded md:h-9 md:w-9" |               class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover" | ||||||
|             /> |             /> | ||||||
|           </template> |           </template> | ||||||
|  |  | ||||||
|  | |||||||
| @ -35,16 +35,7 @@ | |||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       <div |       <div | ||||||
|         class=" |         class="grid col-span-12 mt-6 text-center xl:mt-0 sm:grid-cols-4 xl:text-right xl:col-span-3 xl:grid-cols-1 xxl:col-span-2" | ||||||
|           grid |  | ||||||
|           col-span-12 |  | ||||||
|           mt-6 |  | ||||||
|           text-center |  | ||||||
|           xl:mt-0 |  | ||||||
|           sm:grid-cols-4 |  | ||||||
|           xl:text-right xl:col-span-3 xl:grid-cols-1 |  | ||||||
|           xxl:col-span-2 |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <div class="px-6 py-2"> |         <div class="px-6 py-2"> | ||||||
|           <span class="text-xs leading-5 lg:text-sm"> |           <span class="text-xs leading-5 lg:text-sm"> | ||||||
| @ -177,10 +168,12 @@ const getChartInvoices = computed(() => { | |||||||
|   return [] |   return [] | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | const customerId = computed(() => route.params.id) | ||||||
|  |  | ||||||
| watch( | watch( | ||||||
|   route, |   () => customerId.value, | ||||||
|   () => { |   (id) => { | ||||||
|     if (route.params.id) { |     if (id && route.name === 'customers.view') { | ||||||
|       loadCustomer() |       loadCustomer() | ||||||
|     } |     } | ||||||
|     selectedYear.value = 'This year' |     selectedYear.value = 'This year' | ||||||
|  | |||||||
| @ -37,32 +37,10 @@ | |||||||
|  |  | ||||||
|     <!-- Sidebar --> |     <!-- Sidebar --> | ||||||
|     <div |     <div | ||||||
|       class=" |       class="fixed top-0 left-0 hidden h-full pt-16 pb-[6.4rem] ml-56 bg-white xl:ml-64 w-88 xl:block" | ||||||
|         fixed |  | ||||||
|         top-0 |  | ||||||
|         left-0 |  | ||||||
|         hidden |  | ||||||
|         h-full |  | ||||||
|         pt-16 |  | ||||||
|         pb-[6.4rem] |  | ||||||
|         ml-56 |  | ||||||
|         bg-white |  | ||||||
|         xl:ml-64 |  | ||||||
|         w-88 |  | ||||||
|         xl:block |  | ||||||
|       " |  | ||||||
|     > |     > | ||||||
|       <div |       <div | ||||||
|         class=" |         class="flex items-center justify-between px-4 pt-8 pb-2 border border-gray-200 border-solid height-full" | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-between |  | ||||||
|           px-4 |  | ||||||
|           pt-8 |  | ||||||
|           pb-2 |  | ||||||
|           border border-gray-200 border-solid |  | ||||||
|           height-full |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <div class="mb-6"> |         <div class="mb-6"> | ||||||
|           <BaseInput |           <BaseInput | ||||||
| @ -92,14 +70,7 @@ | |||||||
|             </template> |             </template> | ||||||
|  |  | ||||||
|             <div |             <div | ||||||
|               class=" |               class="px-4 py-1 pb-2 mb-1 mb-2 text-sm border-b border-gray-200 border-solid" | ||||||
|                 px-4 |  | ||||||
|                 py-1 |  | ||||||
|                 pb-2 |  | ||||||
|                 mb-1 mb-2 |  | ||||||
|                 text-sm |  | ||||||
|                 border-b border-gray-200 border-solid |  | ||||||
|               " |  | ||||||
|             > |             > | ||||||
|               {{ $t('general.sort_by') }} |               {{ $t('general.sort_by') }} | ||||||
|             </div> |             </div> | ||||||
| @ -156,12 +127,7 @@ | |||||||
|  |  | ||||||
|       <div |       <div | ||||||
|         ref="estimateListSection" |         ref="estimateListSection" | ||||||
|         class=" |         class="h-full overflow-y-scroll border-l border-gray-200 border-solid base-scroll" | ||||||
|           h-full |  | ||||||
|           overflow-y-scroll |  | ||||||
|           border-l border-gray-200 border-solid |  | ||||||
|           base-scroll |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <div v-for="(estimate, index) in estimateList" :key="index"> |         <div v-for="(estimate, index) in estimateList" :key="index"> | ||||||
|           <router-link |           <router-link | ||||||
| @ -181,29 +147,11 @@ | |||||||
|               <BaseText |               <BaseText | ||||||
|                 :text="estimate.customer.name" |                 :text="estimate.customer.name" | ||||||
|                 :length="30" |                 :length="30" | ||||||
|                 class=" |                 class="pr-2 mb-2 text-sm not-italic font-normal leading-5 text-black capitalize truncate" | ||||||
|                   pr-2 |  | ||||||
|                   mb-2 |  | ||||||
|                   text-sm |  | ||||||
|                   not-italic |  | ||||||
|                   font-normal |  | ||||||
|                   leading-5 |  | ||||||
|                   text-black |  | ||||||
|                   capitalize |  | ||||||
|                   truncate |  | ||||||
|                 " |  | ||||||
|               /> |               /> | ||||||
|  |  | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="mt-1 mb-2 text-xs not-italic font-medium leading-5 text-gray-600" | ||||||
|                   mt-1 |  | ||||||
|                   mb-2 |  | ||||||
|                   text-xs |  | ||||||
|                   not-italic |  | ||||||
|                   font-medium |  | ||||||
|                   leading-5 |  | ||||||
|                   text-gray-600 |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ estimate.estimate_number }} |                 {{ estimate.estimate_number }} | ||||||
|               </div> |               </div> | ||||||
| @ -220,26 +168,11 @@ | |||||||
|               <BaseFormatMoney |               <BaseFormatMoney | ||||||
|                 :amount="estimate.total" |                 :amount="estimate.total" | ||||||
|                 :currency="estimate.customer.currency" |                 :currency="estimate.customer.currency" | ||||||
|                 class=" |                 class="block mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900" | ||||||
|                   block |  | ||||||
|                   mb-2 |  | ||||||
|                   text-xl |  | ||||||
|                   not-italic |  | ||||||
|                   font-semibold |  | ||||||
|                   leading-8 |  | ||||||
|                   text-right text-gray-900 |  | ||||||
|                 " |  | ||||||
|               /> |               /> | ||||||
|  |  | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="text-sm not-italic font-normal leading-5 text-right text-gray-600 est-date" | ||||||
|                   text-sm |  | ||||||
|                   not-italic |  | ||||||
|                   font-normal |  | ||||||
|                   leading-5 |  | ||||||
|                   text-right text-gray-600 |  | ||||||
|                   est-date |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ estimate.formatted_estimate_date }} |                 {{ estimate.formatted_estimate_date }} | ||||||
|               </div> |               </div> | ||||||
| @ -264,13 +197,7 @@ | |||||||
|     > |     > | ||||||
|       <iframe |       <iframe | ||||||
|         :src="`${shareableLink}`" |         :src="`${shareableLink}`" | ||||||
|         class=" |         class="flex-1 border border-gray-400 border-solid rounded-md bg-white frame-style" | ||||||
|           flex-1 |  | ||||||
|           border border-gray-400 border-solid |  | ||||||
|           rounded-md |  | ||||||
|           bg-white |  | ||||||
|           frame-style |  | ||||||
|         " |  | ||||||
|       /> |       /> | ||||||
|     </div> |     </div> | ||||||
|   </BasePage> |   </BasePage> | ||||||
| @ -345,11 +272,14 @@ const getCurrentEstimateId = computed(() => { | |||||||
|   return null |   return null | ||||||
| }) | }) | ||||||
|  |  | ||||||
| watch(route, (to, from) => { | const estimateId = computed(() => route.params.id) | ||||||
|   if (to.name === 'estimates.view') { |  | ||||||
|     loadEstimate() | watch( | ||||||
|  |   () => estimateId.value, | ||||||
|  |   (id) => { | ||||||
|  |     if (id && route.name === 'estimates.view') loadEstimate() | ||||||
|   } |   } | ||||||
| }) | ) | ||||||
|  |  | ||||||
| loadEstimates() | loadEstimates() | ||||||
| loadEstimate() | loadEstimate() | ||||||
|  | |||||||
| @ -65,11 +65,14 @@ const getCurrentInvoiceId = computed(() => { | |||||||
|   return null |   return null | ||||||
| }) | }) | ||||||
|  |  | ||||||
| watch(route, (to, from) => { | const invoiceId = computed(() => route.params.id) | ||||||
|   if (to.name === 'invoices.view') { |  | ||||||
|     loadInvoice() | watch( | ||||||
|  |   () => invoiceId.value, | ||||||
|  |   (id) => { | ||||||
|  |     if (id && route.name === 'invoices.view') loadInvoice() | ||||||
|   } |   } | ||||||
| }) | ) | ||||||
|  |  | ||||||
| async function onMarkAsSent() { | async function onMarkAsSent() { | ||||||
|   dialogStore |   dialogStore | ||||||
| @ -286,32 +289,10 @@ onSearched = debounce(onSearched, 500) | |||||||
|  |  | ||||||
|     <!-- sidebar --> |     <!-- sidebar --> | ||||||
|     <div |     <div | ||||||
|       class=" |       class="fixed top-0 left-0 hidden h-full pt-16 pb-[6.4rem] ml-56 bg-white xl:ml-64 w-88 xl:block" | ||||||
|         fixed |  | ||||||
|         top-0 |  | ||||||
|         left-0 |  | ||||||
|         hidden |  | ||||||
|         h-full |  | ||||||
|         pt-16 |  | ||||||
|         pb-[6.4rem] |  | ||||||
|         ml-56 |  | ||||||
|         bg-white |  | ||||||
|         xl:ml-64 |  | ||||||
|         w-88 |  | ||||||
|         xl:block |  | ||||||
|       " |  | ||||||
|     > |     > | ||||||
|       <div |       <div | ||||||
|         class=" |         class="flex items-center justify-between px-4 pt-8 pb-2 border border-gray-200 border-solid height-full" | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-between |  | ||||||
|           px-4 |  | ||||||
|           pt-8 |  | ||||||
|           pb-2 |  | ||||||
|           border border-gray-200 border-solid |  | ||||||
|           height-full |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <div class="mb-6"> |         <div class="mb-6"> | ||||||
|           <BaseInput |           <BaseInput | ||||||
| @ -335,14 +316,7 @@ onSearched = debounce(onSearched, 500) | |||||||
|               </BaseButton> |               </BaseButton> | ||||||
|             </template> |             </template> | ||||||
|             <div |             <div | ||||||
|               class=" |               class="px-2 py-1 pb-2 mb-1 mb-2 text-sm border-b border-gray-200 border-solid" | ||||||
|                 px-2 |  | ||||||
|                 py-1 |  | ||||||
|                 pb-2 |  | ||||||
|                 mb-1 mb-2 |  | ||||||
|                 text-sm |  | ||||||
|                 border-b border-gray-200 border-solid |  | ||||||
|               " |  | ||||||
|             > |             > | ||||||
|               {{ $t('general.sort_by') }} |               {{ $t('general.sort_by') }} | ||||||
|             </div> |             </div> | ||||||
| @ -399,12 +373,7 @@ onSearched = debounce(onSearched, 500) | |||||||
|  |  | ||||||
|       <div |       <div | ||||||
|         ref="invoiceListSection" |         ref="invoiceListSection" | ||||||
|         class=" |         class="h-full overflow-y-scroll border-l border-gray-200 border-solid base-scroll" | ||||||
|           h-full |  | ||||||
|           overflow-y-scroll |  | ||||||
|           border-l border-gray-200 border-solid |  | ||||||
|           base-scroll |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <div v-for="(invoice, index) in invoiceList" :key="index"> |         <div v-for="(invoice, index) in invoiceList" :key="index"> | ||||||
|           <router-link |           <router-link | ||||||
| @ -424,29 +393,11 @@ onSearched = debounce(onSearched, 500) | |||||||
|               <BaseText |               <BaseText | ||||||
|                 :text="invoice.customer.name" |                 :text="invoice.customer.name" | ||||||
|                 :length="30" |                 :length="30" | ||||||
|                 class=" |                 class="pr-2 mb-2 text-sm not-italic font-normal leading-5 text-black capitalize truncate" | ||||||
|                   pr-2 |  | ||||||
|                   mb-2 |  | ||||||
|                   text-sm |  | ||||||
|                   not-italic |  | ||||||
|                   font-normal |  | ||||||
|                   leading-5 |  | ||||||
|                   text-black |  | ||||||
|                   capitalize |  | ||||||
|                   truncate |  | ||||||
|                 " |  | ||||||
|               /> |               /> | ||||||
|  |  | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="mt-1 mb-2 text-xs not-italic font-medium leading-5 text-gray-600" | ||||||
|                   mt-1 |  | ||||||
|                   mb-2 |  | ||||||
|                   text-xs |  | ||||||
|                   not-italic |  | ||||||
|                   font-medium |  | ||||||
|                   leading-5 |  | ||||||
|                   text-gray-600 |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ invoice.invoice_number }} |                 {{ invoice.invoice_number }} | ||||||
|               </div> |               </div> | ||||||
| @ -460,27 +411,12 @@ onSearched = debounce(onSearched, 500) | |||||||
|  |  | ||||||
|             <div class="flex-1 whitespace-nowrap right"> |             <div class="flex-1 whitespace-nowrap right"> | ||||||
|               <BaseFormatMoney |               <BaseFormatMoney | ||||||
|                 class=" |                 class="mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900 block" | ||||||
|                   mb-2 |  | ||||||
|                   text-xl |  | ||||||
|                   not-italic |  | ||||||
|                   font-semibold |  | ||||||
|                   leading-8 |  | ||||||
|                   text-right text-gray-900 |  | ||||||
|                   block |  | ||||||
|                 " |  | ||||||
|                 :amount="invoice.total" |                 :amount="invoice.total" | ||||||
|                 :currency="invoice.customer.currency" |                 :currency="invoice.customer.currency" | ||||||
|               /> |               /> | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="text-sm not-italic font-normal leading-5 text-right text-gray-600 est-date" | ||||||
|                   text-sm |  | ||||||
|                   not-italic |  | ||||||
|                   font-normal |  | ||||||
|                   leading-5 |  | ||||||
|                   text-right text-gray-600 |  | ||||||
|                   est-date |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ invoice.formatted_invoice_date }} |                 {{ invoice.formatted_invoice_date }} | ||||||
|               </div> |               </div> | ||||||
| @ -505,13 +441,7 @@ onSearched = debounce(onSearched, 500) | |||||||
|     > |     > | ||||||
|       <iframe |       <iframe | ||||||
|         :src="`${shareableLink}`" |         :src="`${shareableLink}`" | ||||||
|         class=" |         class="flex-1 border border-gray-400 border-solid bg-white rounded-md frame-style" | ||||||
|           flex-1 |  | ||||||
|           border border-gray-400 border-solid |  | ||||||
|           bg-white |  | ||||||
|           rounded-md |  | ||||||
|           frame-style |  | ||||||
|         " |  | ||||||
|       /> |       /> | ||||||
|     </div> |     </div> | ||||||
|   </BasePage> |   </BasePage> | ||||||
|  | |||||||
| @ -54,8 +54,6 @@ | |||||||
|               label="name" |               label="name" | ||||||
|               :options="itemStore.itemUnits" |               :options="itemStore.itemUnits" | ||||||
|               value-prop="id" |               value-prop="id" | ||||||
|               :can-deselect="false" |  | ||||||
|               :can-clear="false" |  | ||||||
|               :placeholder="$t('items.select_a_unit')" |               :placeholder="$t('items.select_a_unit')" | ||||||
|               searchable |               searchable | ||||||
|               track-by="name" |               track-by="name" | ||||||
|  | |||||||
| @ -22,31 +22,10 @@ | |||||||
|  |  | ||||||
|     <!-- Sidebar --> |     <!-- Sidebar --> | ||||||
|     <div |     <div | ||||||
|       class=" |       class="fixed top-0 left-0 hidden h-full pt-16 pb-[6rem] ml-56 bg-white xl:ml-64 w-88 xl:block" | ||||||
|         fixed |  | ||||||
|         top-0 |  | ||||||
|         left-0 |  | ||||||
|         hidden |  | ||||||
|         h-full |  | ||||||
|         pt-16 |  | ||||||
|         pb-[6rem] |  | ||||||
|         ml-56 |  | ||||||
|         bg-white |  | ||||||
|         xl:ml-64 |  | ||||||
|         w-88 |  | ||||||
|         xl:block |  | ||||||
|       " |  | ||||||
|     > |     > | ||||||
|       <div |       <div | ||||||
|         class=" |         class="flex items-center justify-between px-4 pt-8 pb-6 border border-gray-200 border-solid" | ||||||
|           flex |  | ||||||
|           items-center |  | ||||||
|           justify-between |  | ||||||
|           px-4 |  | ||||||
|           pt-8 |  | ||||||
|           pb-6 |  | ||||||
|           border border-gray-200 border-solid |  | ||||||
|         " |  | ||||||
|       > |       > | ||||||
|         <BaseInput |         <BaseInput | ||||||
|           v-model="searchData.searchText" |           v-model="searchData.searchText" | ||||||
| @ -70,14 +49,7 @@ | |||||||
|             </template> |             </template> | ||||||
|  |  | ||||||
|             <div |             <div | ||||||
|               class=" |               class="px-4 py-1 pb-2 mb-2 text-sm border-b border-gray-200 border-solid" | ||||||
|                 px-4 |  | ||||||
|                 py-1 |  | ||||||
|                 pb-2 |  | ||||||
|                 mb-2 |  | ||||||
|                 text-sm |  | ||||||
|                 border-b border-gray-200 border-solid |  | ||||||
|               " |  | ||||||
|             > |             > | ||||||
|               {{ $t('general.sort_by') }} |               {{ $t('general.sort_by') }} | ||||||
|             </div> |             </div> | ||||||
| @ -159,43 +131,17 @@ | |||||||
|               <BaseText |               <BaseText | ||||||
|                 :text="payment?.customer?.name" |                 :text="payment?.customer?.name" | ||||||
|                 :length="30" |                 :length="30" | ||||||
|                 class=" |                 class="pr-2 mb-2 text-sm not-italic font-normal leading-5 text-black capitalize truncate" | ||||||
|                   pr-2 |  | ||||||
|                   mb-2 |  | ||||||
|                   text-sm |  | ||||||
|                   not-italic |  | ||||||
|                   font-normal |  | ||||||
|                   leading-5 |  | ||||||
|                   text-black |  | ||||||
|                   capitalize |  | ||||||
|                   truncate |  | ||||||
|                 " |  | ||||||
|               /> |               /> | ||||||
|  |  | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="mb-1 text-xs not-italic font-medium leading-5 text-gray-500 capitalize" | ||||||
|                   mb-1 |  | ||||||
|                   text-xs |  | ||||||
|                   not-italic |  | ||||||
|                   font-medium |  | ||||||
|                   leading-5 |  | ||||||
|                   text-gray-500 |  | ||||||
|                   capitalize |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ payment?.payment_number }} |                 {{ payment?.payment_number }} | ||||||
|               </div> |               </div> | ||||||
|  |  | ||||||
|               <div |               <div | ||||||
|                 class=" |                 class="mb-1 text-xs not-italic font-medium leading-5 text-gray-500 capitalize" | ||||||
|                   mb-1 |  | ||||||
|                   text-xs |  | ||||||
|                   not-italic |  | ||||||
|                   font-medium |  | ||||||
|                   leading-5 |  | ||||||
|                   text-gray-500 |  | ||||||
|                   capitalize |  | ||||||
|                 " |  | ||||||
|               > |               > | ||||||
|                 {{ payment?.invoice_number }} |                 {{ payment?.invoice_number }} | ||||||
|               </div> |               </div> | ||||||
| @ -203,15 +149,7 @@ | |||||||
|  |  | ||||||
|             <div class="flex-1 whitespace-nowrap right"> |             <div class="flex-1 whitespace-nowrap right"> | ||||||
|               <BaseFormatMoney |               <BaseFormatMoney | ||||||
|                 class=" |                 class="block mb-2 text-xl not-italic font-semibold leading-8 text-right text-gray-900" | ||||||
|                   block |  | ||||||
|                   mb-2 |  | ||||||
|                   text-xl |  | ||||||
|                   not-italic |  | ||||||
|                   font-semibold |  | ||||||
|                   leading-8 |  | ||||||
|                   text-right text-gray-900 |  | ||||||
|                 " |  | ||||||
|                 :amount="payment?.amount" |                 :amount="payment?.amount" | ||||||
|                 :currency="payment.customer?.currency" |                 :currency="payment.customer?.currency" | ||||||
|               /> |               /> | ||||||
| @ -313,9 +251,14 @@ const paymentDate = computed(() => { | |||||||
|   ) |   ) | ||||||
| }) | }) | ||||||
|  |  | ||||||
| watch(route, () => { | const paymentId = computed(() => route.params.id) | ||||||
|   loadPayment() |  | ||||||
| }) | watch( | ||||||
|  |   () => paymentId.value, | ||||||
|  |   (id) => { | ||||||
|  |     if (id && route.name === 'payments.view') loadPayment() | ||||||
|  |   } | ||||||
|  | ) | ||||||
|  |  | ||||||
| loadPayments() | loadPayments() | ||||||
| loadPayment() | loadPayment() | ||||||
|  | |||||||
| @ -78,10 +78,12 @@ let isLoading = computed(() => { | |||||||
|   return recurringInvoiceStore.isFetchingViewData |   return recurringInvoiceStore.isFetchingViewData | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | const invoiceId = computed(() => route.params.id) | ||||||
|  |  | ||||||
| watch( | watch( | ||||||
|   route, |   () => invoiceId.value, | ||||||
|   () => { |   (id) => { | ||||||
|     if (route.params.id && route.name === 'recurring-invoices.view') { |     if (id && route.name === 'recurring-invoices.view') { | ||||||
|       loadRecurringInvoice() |       loadRecurringInvoice() | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  | |||||||
| @ -1485,7 +1485,7 @@ | |||||||
|   "pdf_estimate_label": "Estimate", |   "pdf_estimate_label": "Estimate", | ||||||
|   "pdf_estimate_number": "Estimate Number", |   "pdf_estimate_number": "Estimate Number", | ||||||
|   "pdf_estimate_date": "Estimate Date", |   "pdf_estimate_date": "Estimate Date", | ||||||
|   "pdf_estimate_expire_date": "Expiry date", |   "pdf_estimate_expire_date": "Expiry Date", | ||||||
|   "pdf_invoice_label": "Invoice", |   "pdf_invoice_label": "Invoice", | ||||||
|   "pdf_invoice_number": "Invoice Number", |   "pdf_invoice_number": "Invoice Number", | ||||||
|   "pdf_invoice_date": "Invoice Date", |   "pdf_invoice_date": "Invoice Date", | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ import sk from './sk.json' | |||||||
| import vi from './vi.json' | import vi from './vi.json' | ||||||
| import el from './el.json' | import el from './el.json' | ||||||
| import hr from './hr.json' | import hr from './hr.json' | ||||||
|  | import th from './th.json' | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|   cs, |   cs, | ||||||
| @ -37,5 +38,6 @@ export default { | |||||||
|   vi, |   vi, | ||||||
|   pl, |   pl, | ||||||
|   el, |   el, | ||||||
|   hr |   hr, | ||||||
|  |   th | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										1525
									
								
								resources/scripts/locales/th.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1525
									
								
								resources/scripts/locales/th.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/static/fonts/THSarabunNew.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -386,6 +386,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -408,6 +408,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -346,6 +346,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -327,6 +327,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -377,6 +377,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| <html> | <html> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_invoice_label') - {{$invoice->invoice_number}}</title> |     <title>@lang('pdf_invoice_label') - {{ $invoice->invoice_number }}</title> | ||||||
|     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | ||||||
|  |  | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -187,7 +187,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|         .total-display-table { |         .total-display-table { | ||||||
|              border-top: none; |             border-top: none; | ||||||
|             page-break-inside: avoid; |             page-break-inside: avoid; | ||||||
|             page-break-before: auto; |             page-break-before: auto; | ||||||
|             page-break-after: auto; |             page-break-after: auto; | ||||||
| @ -304,7 +304,12 @@ | |||||||
|         .pl-0 { |         .pl-0 { | ||||||
|             padding-left: 0; |             padding-left: 0; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
| @ -312,10 +317,10 @@ | |||||||
|         <table width="100%"> |         <table width="100%"> | ||||||
|             <tr> |             <tr> | ||||||
|                 <td width="50%" class="header-section-left"> |                 <td width="50%" class="header-section-left"> | ||||||
|                     @if($logo) |                     @if ($logo) | ||||||
|                     <img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo"> |                         <img class="header-logo" style="height: 50px;" src="{{ $logo }}" alt="Company Logo"> | ||||||
|                     @else |                     @else | ||||||
|                     <h1 class="header-logo"> {{$invoice->customer->company->name}} </h1> |                         <h1 class="header-logo"> {{ $invoice->customer->company->name }} </h1> | ||||||
|                     @endif |                     @endif | ||||||
|                 </td> |                 </td> | ||||||
|                 <td width="50%" class="text-right company-address-container company-address"> |                 <td width="50%" class="text-right company-address-container company-address"> | ||||||
| @ -331,14 +336,14 @@ | |||||||
|         <div class="main-content"> |         <div class="main-content"> | ||||||
|             <div class="customer-address-container"> |             <div class="customer-address-container"> | ||||||
|                 <div class="billing-address-container billing-address"> |                 <div class="billing-address-container billing-address"> | ||||||
|                     @if($billing_address) |                     @if ($billing_address) | ||||||
|                         <b>@lang('pdf_bill_to')</b> <br> |                         <b>@lang('pdf_bill_to')</b> <br> | ||||||
|                         {!! $billing_address !!} |                         {!! $billing_address !!} | ||||||
|                     @endif |                     @endif | ||||||
|                 </div> |                 </div> | ||||||
|  |  | ||||||
|                 <div @if($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif> |                 <div @if ($billing_address !== '</br>') class="shipping-address-container shipping-address" @else class="shipping-address-container--left shipping-address" @endif> | ||||||
|                     @if($shipping_address) |                     @if ($shipping_address) | ||||||
|                         <b>@lang('pdf_ship_to')</b> <br> |                         <b>@lang('pdf_ship_to')</b> <br> | ||||||
|                         {!! $shipping_address !!} |                         {!! $shipping_address !!} | ||||||
|                     @endif |                     @endif | ||||||
| @ -350,15 +355,15 @@ | |||||||
|                 <table> |                 <table> | ||||||
|                     <tr> |                     <tr> | ||||||
|                         <td class="attribute-label">@lang('pdf_invoice_number')</td> |                         <td class="attribute-label">@lang('pdf_invoice_number')</td> | ||||||
|                         <td class="attribute-value">  {{$invoice->invoice_number}}</td> |                         <td class="attribute-value">  {{ $invoice->invoice_number }}</td> | ||||||
|                     </tr> |                     </tr> | ||||||
|                     <tr> |                     <tr> | ||||||
|                         <td class="attribute-label">@lang('pdf_invoice_date')</td> |                         <td class="attribute-label">@lang('pdf_invoice_date')</td> | ||||||
|                         <td class="attribute-value">  {{$invoice->formattedInvoiceDate}}</td> |                         <td class="attribute-value">  {{ $invoice->formattedInvoiceDate }}</td> | ||||||
|                     </tr> |                     </tr> | ||||||
|                     <tr> |                     <tr> | ||||||
|                         <td class="attribute-label">@lang('pdf_invoice_due_date')</td> |                         <td class="attribute-label">@lang('pdf_invoice_due_date')</td> | ||||||
|                         <td class="attribute-value">  {{$invoice->formattedDueDate}}</td> |                         <td class="attribute-value">  {{ $invoice->formattedDueDate }}</td> | ||||||
|                     </tr> |                     </tr> | ||||||
|                 </table> |                 </table> | ||||||
|             </div> |             </div> | ||||||
| @ -368,7 +373,7 @@ | |||||||
|         @include('app.pdf.invoice.partials.table') |         @include('app.pdf.invoice.partials.table') | ||||||
|  |  | ||||||
|         <div class="notes"> |         <div class="notes"> | ||||||
|             @if($notes) |             @if ($notes) | ||||||
|                 <div class="notes-label"> |                 <div class="notes-label"> | ||||||
|                     @lang('pdf_notes') |                     @lang('pdf_notes') | ||||||
|                 </div> |                 </div> | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								resources/views/app/pdf/locale/th.blade.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								resources/views/app/pdf/locale/th.blade.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | <style type="text/css"> | ||||||
|  |     @font-face { | ||||||
|  |         font-family: 'THSarabunNew'; | ||||||
|  |         font-style: normal; | ||||||
|  |         font-weight: normal; | ||||||
|  |         src: url("{{ resource_path('static/fonts/THSarabunNew.ttf') }}") format('truetype'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @font-face { | ||||||
|  |         font-family: 'THSarabunNew'; | ||||||
|  |         font-style: normal; | ||||||
|  |         font-weight: bold; | ||||||
|  |         src: url("{{ resource_path('static/fonts/THSarabunNew-Bold.ttf') }}") format('truetype'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @font-face { | ||||||
|  |         font-family: 'THSarabunNew'; | ||||||
|  |         font-style: italic; | ||||||
|  |         font-weight: normal; | ||||||
|  |         src: url("{{ resource_path('static/fonts/THSarabunNew-Italic.ttf') }}") format('truetype'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @font-face { | ||||||
|  |         font-family: 'THSarabunNew'; | ||||||
|  |         font-style: italic; | ||||||
|  |         font-weight: bold; | ||||||
|  |         src: url("{{ resource_path('static/fonts/THSarabunNew-BoldItalic.ttf') }}") format('truetype'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     body { | ||||||
|  |         font-family: "THSarabunNew", sans-serif !important; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | </style> | ||||||
| @ -276,6 +276,10 @@ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |         @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_expense_report_label')</title> |     <title>@lang('pdf_expense_report_label')</title> | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -11,7 +12,7 @@ | |||||||
|             border-collapse: collapse; |             border-collapse: collapse; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .sub-container{ |         .sub-container { | ||||||
|             padding: 0px 20px; |             padding: 0px 20px; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -133,7 +134,12 @@ | |||||||
|             color: #5851D8; |             color: #5851D8; | ||||||
|         } |         } | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |     @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <div class="sub-container"> |     <div class="sub-container"> | ||||||
|         <table class="report-header"> |         <table class="report-header"> | ||||||
| @ -155,18 +161,18 @@ | |||||||
|         <div class="expenses-table-container"> |         <div class="expenses-table-container"> | ||||||
|             <table class="expenses-table"> |             <table class="expenses-table"> | ||||||
|                 @foreach ($expenseCategories as $expenseCategory) |                 @foreach ($expenseCategories as $expenseCategory) | ||||||
|                     <tr> |                 <tr> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="expense-title"> |                         <p class="expense-title"> | ||||||
|                                 {{ $expenseCategory->category->name }} |                             {{ $expenseCategory->category->name }} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="expense-amount"> |                         <p class="expense-amount"> | ||||||
|                                 {!! format_money_pdf($expenseCategory->total_amount) !!} |                             {!! format_money_pdf($expenseCategory->total_amount, $currency) !!} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                     </tr> |                 </tr> | ||||||
|                 @endforeach |                 @endforeach | ||||||
|             </table> |             </table> | ||||||
|         </div> |         </div> | ||||||
| @ -175,7 +181,7 @@ | |||||||
|     <table class="expense-total-table"> |     <table class="expense-total-table"> | ||||||
|         <tr> |         <tr> | ||||||
|             <td class="expense-total-cell"> |             <td class="expense-total-cell"> | ||||||
|                 <p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p> |                 <p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| @ -185,9 +191,10 @@ | |||||||
|                 <p class="report-footer-label">@lang('pdf_total_expenses_label')</p> |                 <p class="report-footer-label">@lang('pdf_total_expenses_label')</p> | ||||||
|             </td> |             </td> | ||||||
|             <td> |             <td> | ||||||
|                 <p class="report-footer-value">{!! format_money_pdf($totalExpense) !!}</p> |                 <p class="report-footer-value">{!! format_money_pdf($totalExpense, $currency) !!}</p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
| </html> | </html> | ||||||
| @ -1,5 +1,6 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_profit_loss_label')</title> |     <title>@lang('pdf_profit_loss_label')</title> | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -11,7 +12,7 @@ | |||||||
|             border-collapse: collapse; |             border-collapse: collapse; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .sub-container{ |         .sub-container { | ||||||
|             padding: 0px 20px; |             padding: 0px 20px; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -158,7 +159,12 @@ | |||||||
|             color: #5851D8; |             color: #5851D8; | ||||||
|         } |         } | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |     @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <div class="sub-container"> |     <div class="sub-container"> | ||||||
|         <table class="report-header"> |         <table class="report-header"> | ||||||
| @ -183,7 +189,7 @@ | |||||||
|                     <p class="income-title">@lang("pdf_income_label")</p> |                     <p class="income-title">@lang("pdf_income_label")</p> | ||||||
|                 </td> |                 </td> | ||||||
|                 <td> |                 <td> | ||||||
|                     <p class="income-amount">{!! format_money_pdf($income) !!}</p> |                     <p class="income-amount">{!! format_money_pdf($income, $currency) !!}</p> | ||||||
|                 </td> |                 </td> | ||||||
|             </tr> |             </tr> | ||||||
|         </table> |         </table> | ||||||
| @ -191,18 +197,18 @@ | |||||||
|         <div class="expenses-table-container"> |         <div class="expenses-table-container"> | ||||||
|             <table class="expenses-table"> |             <table class="expenses-table"> | ||||||
|                 @foreach ($expenseCategories as $expenseCategory) |                 @foreach ($expenseCategories as $expenseCategory) | ||||||
|                     <tr> |                 <tr> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="expense-title"> |                         <p class="expense-title"> | ||||||
|                                 {{ $expenseCategory->category->name }} |                             {{ $expenseCategory->category->name }} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="expense-amount"> |                         <p class="expense-amount"> | ||||||
|                                 {!! format_money_pdf($expenseCategory->total_amount) !!} |                             {!! format_money_pdf($expenseCategory->total_amount, $currency) !!} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                     </tr> |                 </tr> | ||||||
|                 @endforeach |                 @endforeach | ||||||
|  |  | ||||||
|             </table> |             </table> | ||||||
| @ -212,7 +218,7 @@ | |||||||
|     <table class="expense-total-indicator-table"> |     <table class="expense-total-indicator-table"> | ||||||
|         <tr> |         <tr> | ||||||
|             <td class="expense-total-cell"> |             <td class="expense-total-cell"> | ||||||
|                 <p class="expense-total">{!! format_money_pdf($totalExpense) !!}</p> |                 <p class="expense-total">{!! format_money_pdf($totalExpense, $currency) !!}</p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| @ -222,9 +228,10 @@ | |||||||
|                 <p class="report-footer-label">@lang("pdf_net_profit_label")</p> |                 <p class="report-footer-label">@lang("pdf_net_profit_label")</p> | ||||||
|             </td> |             </td> | ||||||
|             <td> |             <td> | ||||||
|                 <p class="report-footer-value">{!! format_money_pdf(($income-$totalExpense)) !!}</p> |                 <p class="report-footer-value">{!! format_money_pdf($income - $totalExpense, $currency) !!}</p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
| </html> | </html> | ||||||
| @ -1,5 +1,6 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_sales_customers_label')</title> |     <title>@lang('pdf_sales_customers_label')</title> | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -11,7 +12,7 @@ | |||||||
|             border-collapse: collapse; |             border-collapse: collapse; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .sub-container{ |         .sub-container { | ||||||
|             padding: 0px 20px; |             padding: 0px 20px; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -132,11 +133,17 @@ | |||||||
|             line-height: 21px; |             line-height: 21px; | ||||||
|             color: #5851D8; |             color: #5851D8; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .text-center { |         .text-center { | ||||||
|             text-align: center; |             text-align: center; | ||||||
|         } |         } | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |     @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <div class="sub-container"> |     <div class="sub-container"> | ||||||
|         <table class="report-header"> |         <table class="report-header"> | ||||||
| @ -156,34 +163,34 @@ | |||||||
|         </table> |         </table> | ||||||
|  |  | ||||||
|         @foreach ($customers as $customer) |         @foreach ($customers as $customer) | ||||||
|             <p class="sales-customer-name">{{ $customer->name }}</p> |         <p class="sales-customer-name">{{ $customer->name }}</p> | ||||||
|             <div class="sales-table-container"> |         <div class="sales-table-container"> | ||||||
|                 <table class="sales-table"> |             <table class="sales-table"> | ||||||
|                     @foreach ($customer->invoices as $invoice) |                 @foreach ($customer->invoices as $invoice) | ||||||
|                         <tr> |  | ||||||
|                             <td> |  | ||||||
|                                 <p class="sales-information-text"> |  | ||||||
|                                     {{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }}) |  | ||||||
|                                 </p> |  | ||||||
|                             </td> |  | ||||||
|                             <td> |  | ||||||
|                                 <p class="sales-amount"> |  | ||||||
|                                     {!! format_money_pdf($invoice->base_total) !!} |  | ||||||
|                                 </p> |  | ||||||
|                             </td> |  | ||||||
|                         </tr> |  | ||||||
|                     @endforeach |  | ||||||
|                 </table> |  | ||||||
|             </div> |  | ||||||
|             <table class="sales-total-indicator-table"> |  | ||||||
|                 <tr> |                 <tr> | ||||||
|                     <td class="sales-total-cell"> |                     <td> | ||||||
|                         <p class="sales-total-amount"> |                         <p class="sales-information-text"> | ||||||
|                             {!! format_money_pdf($customer->totalAmount) !!} |                             {{ $invoice->formattedInvoiceDate }} ({{ $invoice->invoice_number }}) | ||||||
|  |                         </p> | ||||||
|  |                     </td> | ||||||
|  |                     <td> | ||||||
|  |                         <p class="sales-amount"> | ||||||
|  |                             {!! format_money_pdf($invoice->base_total, $currency) !!} | ||||||
|                         </p> |                         </p> | ||||||
|                     </td> |                     </td> | ||||||
|                 </tr> |                 </tr> | ||||||
|  |                 @endforeach | ||||||
|             </table> |             </table> | ||||||
|  |         </div> | ||||||
|  |         <table class="sales-total-indicator-table"> | ||||||
|  |             <tr> | ||||||
|  |                 <td class="sales-total-cell"> | ||||||
|  |                     <p class="sales-total-amount"> | ||||||
|  |                         {!! format_money_pdf($customer->totalAmount, $currency) !!} | ||||||
|  |                     </p> | ||||||
|  |                 </td> | ||||||
|  |             </tr> | ||||||
|  |         </table> | ||||||
|         @endforeach |         @endforeach | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
| @ -195,10 +202,11 @@ | |||||||
|             </td> |             </td> | ||||||
|             <td> |             <td> | ||||||
|                 <p class="report-footer-value"> |                 <p class="report-footer-value"> | ||||||
|                     {!! format_money_pdf($totalAmount) !!} |                     {!! format_money_pdf($totalAmount, $currency) !!} | ||||||
|                 </p> |                 </p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
| </html> | </html> | ||||||
| @ -1,5 +1,6 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_sales_items_label')</title> |     <title>@lang('pdf_sales_items_label')</title> | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -11,7 +12,7 @@ | |||||||
|             border-collapse: collapse; |             border-collapse: collapse; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .sub-container{ |         .sub-container { | ||||||
|             padding: 0px 20px; |             padding: 0px 20px; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -132,11 +133,17 @@ | |||||||
|             line-height: 21px; |             line-height: 21px; | ||||||
|             color: #5851D8; |             color: #5851D8; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .text-center { |         .text-center { | ||||||
|             text-align: center; |             text-align: center; | ||||||
|         } |         } | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |     @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <div class="sub-container"> |     <div class="sub-container"> | ||||||
|         <table class="report-header"> |         <table class="report-header"> | ||||||
| @ -157,33 +164,33 @@ | |||||||
|  |  | ||||||
|         <p class="sales-items-title">@lang('pdf_items_label')</p> |         <p class="sales-items-title">@lang('pdf_items_label')</p> | ||||||
|         @foreach ($items as $item) |         @foreach ($items as $item) | ||||||
|             <div class="items-table-container"> |         <div class="items-table-container"> | ||||||
|                 <table class="items-table"> |             <table class="items-table"> | ||||||
|                     <tr> |  | ||||||
|                         <td> |  | ||||||
|                             <p class="item-title"> |  | ||||||
|                                 {{ $item->name }} |  | ||||||
|                             </p> |  | ||||||
|                         </td> |  | ||||||
|                         <td> |  | ||||||
|                             <p class="item-sales-amount"> |  | ||||||
|                                 {!! format_money_pdf($item->total_amount) !!} |  | ||||||
|                             </p> |  | ||||||
|                         </td> |  | ||||||
|                     </tr> |  | ||||||
|                 </table> |  | ||||||
|             </div> |  | ||||||
|         @endforeach |  | ||||||
|  |  | ||||||
|             <table class="sales-total-indicator-table"> |  | ||||||
|                 <tr> |                 <tr> | ||||||
|                     <td class="sales-total-cell"> |                     <td> | ||||||
|                         <p class="sales-total-amount"> |                         <p class="item-title"> | ||||||
|                             {!! format_money_pdf($totalAmount) !!} |                             {{ $item->name }} | ||||||
|  |                         </p> | ||||||
|  |                     </td> | ||||||
|  |                     <td> | ||||||
|  |                         <p class="item-sales-amount"> | ||||||
|  |                             {!! format_money_pdf($item->total_amount, $currency) !!} | ||||||
|                         </p> |                         </p> | ||||||
|                     </td> |                     </td> | ||||||
|                 </tr> |                 </tr> | ||||||
|             </table> |             </table> | ||||||
|  |         </div> | ||||||
|  |         @endforeach | ||||||
|  |  | ||||||
|  |         <table class="sales-total-indicator-table"> | ||||||
|  |             <tr> | ||||||
|  |                 <td class="sales-total-cell"> | ||||||
|  |                     <p class="sales-total-amount"> | ||||||
|  |                         {!! format_money_pdf($totalAmount, $currency) !!} | ||||||
|  |                     </p> | ||||||
|  |                 </td> | ||||||
|  |             </tr> | ||||||
|  |         </table> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -194,10 +201,11 @@ | |||||||
|             </td> |             </td> | ||||||
|             <td> |             <td> | ||||||
|                 <p class="report-footer-value"> |                 <p class="report-footer-value"> | ||||||
|                     {!! format_money_pdf($totalAmount) !!} |                     {!! format_money_pdf($totalAmount, $currency) !!} | ||||||
|                 </p> |                 </p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
| </html> | </html> | ||||||
| @ -1,5 +1,6 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
|  |  | ||||||
| <head> | <head> | ||||||
|     <title>@lang('pdf_tax_summery_label')</title> |     <title>@lang('pdf_tax_summery_label')</title> | ||||||
|     <style type="text/css"> |     <style type="text/css"> | ||||||
| @ -11,7 +12,7 @@ | |||||||
|             border-collapse: collapse; |             border-collapse: collapse; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         .sub-container{ |         .sub-container { | ||||||
|             padding: 0px 20px; |             padding: 0px 20px; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -134,7 +135,12 @@ | |||||||
|             color: #5851D8; |             color: #5851D8; | ||||||
|         } |         } | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     @if (App::isLocale('th')) | ||||||
|  |     @include('app.pdf.locale.th') | ||||||
|  |     @endif | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <div class="sub-container"> |     <div class="sub-container"> | ||||||
|         <table class="report-header"> |         <table class="report-header"> | ||||||
| @ -160,18 +166,18 @@ | |||||||
|         <div class="tax-table-container"> |         <div class="tax-table-container"> | ||||||
|             <table class="tax-table"> |             <table class="tax-table"> | ||||||
|                 @foreach ($taxTypes as $tax) |                 @foreach ($taxTypes as $tax) | ||||||
|                     <tr> |                 <tr> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="tax-title"> |                         <p class="tax-title"> | ||||||
|                                 {{ $tax->taxType->name }} |                             {{ $tax->taxType->name }} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                         <td> |                     <td> | ||||||
|                             <p class="tax-amount"> |                         <p class="tax-amount"> | ||||||
|                                 {!! format_money_pdf($tax->total_tax_amount) !!} |                             {!! format_money_pdf($tax->total_tax_amount, $currency) !!} | ||||||
|                             </p> |                         </p> | ||||||
|                         </td> |                     </td> | ||||||
|                     </tr> |                 </tr> | ||||||
|                 @endforeach |                 @endforeach | ||||||
|  |  | ||||||
|             </table> |             </table> | ||||||
| @ -182,7 +188,7 @@ | |||||||
|         <tr> |         <tr> | ||||||
|             <td class="tax-total-cell"> |             <td class="tax-total-cell"> | ||||||
|                 <p class="tax-total"> |                 <p class="tax-total"> | ||||||
|                     {!! format_money_pdf($totalTaxAmount) !!} |                     {!! format_money_pdf($totalTaxAmount, $currency) !!} | ||||||
|                 </p> |                 </p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
| @ -194,10 +200,11 @@ | |||||||
|             </td> |             </td> | ||||||
|             <td> |             <td> | ||||||
|                 <p class="report-footer-value"> |                 <p class="report-footer-value"> | ||||||
|                     {!! format_money_pdf($totalTaxAmount) !!} |                     {!! format_money_pdf($totalTaxAmount, $currency) !!} | ||||||
|                 </p> |                 </p> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     </table> |     </table> | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
| </html> | </html> | ||||||
							
								
								
									
										0
									
								
								storage/fonts/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								storage/fonts/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										40
									
								
								uffizzi/.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								uffizzi/.env.example
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | APP_ENV=production | ||||||
|  | APP_KEY=base64:kgk/4DW1vEVy7aEvet5FPp5un6PIGe/so8H0mvoUtW0= | ||||||
|  | APP_DEBUG=true | ||||||
|  | APP_LOG_LEVEL=debug | ||||||
|  | APP_URL=http://crater.test | ||||||
|  |  | ||||||
|  | DB_CONNECTION=mysql | ||||||
|  | DB_HOST=127.0.0.1 | ||||||
|  | DB_PORT=3306 | ||||||
|  | DB_DATABASE=crater | ||||||
|  | DB_USERNAME=crater | ||||||
|  | DB_PASSWORD=crater | ||||||
|  |  | ||||||
|  | BROADCAST_DRIVER=log | ||||||
|  | CACHE_DRIVER=file | ||||||
|  | QUEUE_DRIVER=sync | ||||||
|  | SESSION_DRIVER=cookie | ||||||
|  | SESSION_LIFETIME=1440 | ||||||
|  |  | ||||||
|  | REDIS_HOST=127.0.0.1 | ||||||
|  | REDIS_PASSWORD=null | ||||||
|  | REDIS_PORT=6379 | ||||||
|  |  | ||||||
|  | MAIL_DRIVER=smtp | ||||||
|  | MAIL_HOST= | ||||||
|  | MAIL_PORT= | ||||||
|  | MAIL_USERNAME= | ||||||
|  | MAIL_PASSWORD= | ||||||
|  | MAIL_ENCRYPTION= | ||||||
|  |  | ||||||
|  | PUSHER_APP_ID= | ||||||
|  | PUSHER_KEY= | ||||||
|  | PUSHER_SECRET= | ||||||
|  |  | ||||||
|  | SANCTUM_STATEFUL_DOMAINS=crater.test | ||||||
|  | SESSION_DOMAIN=crater.test | ||||||
|  |  | ||||||
|  | TRUSTED_PROXIES="*" | ||||||
|  |  | ||||||
|  | CRON_JOB_AUTH_TOKEN="" | ||||||
							
								
								
									
										64
									
								
								uffizzi/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								uffizzi/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | |||||||
|  | FROM php:8.1-fpm | ||||||
|  |  | ||||||
|  | # Install system dependencies | ||||||
|  | RUN apt-get update && apt-get install -y \ | ||||||
|  |     git \ | ||||||
|  |     curl \ | ||||||
|  |     libpng-dev \ | ||||||
|  |     libonig-dev \ | ||||||
|  |     libxml2-dev \ | ||||||
|  |     zip \ | ||||||
|  |     unzip \ | ||||||
|  |     libzip-dev \ | ||||||
|  |     libmagickwand-dev \ | ||||||
|  |     mariadb-client \ | ||||||
|  |     npm | ||||||
|  |  | ||||||
|  | # Clear cache | ||||||
|  | RUN apt-get clean && rm -rf /var/lib/apt/lists/* | ||||||
|  |  | ||||||
|  | RUN pecl install imagick \ | ||||||
|  |     && docker-php-ext-enable imagick | ||||||
|  |  | ||||||
|  | # Install PHP extensions | ||||||
|  | RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd | ||||||
|  |  | ||||||
|  | # Get latest Composer | ||||||
|  | COPY --from=composer:latest /usr/bin/composer /usr/bin/composer | ||||||
|  |  | ||||||
|  | # Create system user to run Composer and Artisan Commands | ||||||
|  | RUN useradd -G www-data,root -u 1000 -d /home/crater-user crater-user | ||||||
|  | RUN mkdir -p /home/crater-user/.composer && \ | ||||||
|  |     chown -R crater-user:crater-user /home/crater-user | ||||||
|  |  | ||||||
|  | # Mounted volumes | ||||||
|  | COPY ./ /var/www | ||||||
|  | COPY ./docker-compose/php/uploads.ini /usr/local/etc/php/conf.d/uploads.ini | ||||||
|  | COPY ./uffizzi/.env.example /var/www/.env | ||||||
|  |  | ||||||
|  | # Set working directory | ||||||
|  | WORKDIR /var/www | ||||||
|  |  | ||||||
|  | RUN chown -R crater-user:crater-user ./ | ||||||
|  | RUN chmod -R 775 composer.json composer.lock \  | ||||||
|  |         composer.lock storage/framework/ \ | ||||||
|  |         storage/logs/ bootstrap/cache/ /home/crater-user/.composer | ||||||
|  | RUN chown -R $(whoami):$(whoami) /var/log/ | ||||||
|  | RUN chmod -R 775 /var/log | ||||||
|  |  | ||||||
|  | # Cleanup manually generated build files | ||||||
|  | RUN rm -rf /var/www/public/build | ||||||
|  | RUN npm config set user 0 | ||||||
|  | RUN npm config set unsafe-perm true | ||||||
|  | # Frontend bulding | ||||||
|  | RUN sed -i 's/DB_CONNECTION=mysql/DB_CONNECTION=sqlite/g' /var/www/.env | ||||||
|  | RUN sed -i 's/DB_DATABASE=crater/DB_DATABASE=\/tmp\/crater.sqlite/g' /var/www/.env | ||||||
|  | RUN touch /tmp/crater.sqlite | ||||||
|  | RUN composer install --no-interaction --prefer-dist | ||||||
|  | RUN npm i -f | ||||||
|  | RUN npm install --save-dev sass | ||||||
|  | RUN export NODE_OPTIONS="--max-old-space-size=4096" && /usr/bin/npx vite build --target=es2020 | ||||||
|  | RUN sed -i 's/DB_CONNECTION=sqlite/DB_CONNECTION=mysql/g' /var/www/.env | ||||||
|  | RUN sed -i 's/DB_DATABASE=\/tmp\/crater.sqlite/DB_DATABASE=crater/g' /var/www/.env | ||||||
|  |  | ||||||
|  | USER crater-user | ||||||
							
								
								
									
										68
									
								
								uffizzi/crond/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								uffizzi/crond/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | FROM php:8.1-fpm as build | ||||||
|  |  | ||||||
|  | # Install system dependencies | ||||||
|  | RUN apt-get update && apt-get install -y \ | ||||||
|  |     git \ | ||||||
|  |     curl \ | ||||||
|  |     libpng-dev \ | ||||||
|  |     libonig-dev \ | ||||||
|  |     libxml2-dev \ | ||||||
|  |     zip \ | ||||||
|  |     unzip \ | ||||||
|  |     libzip-dev \ | ||||||
|  |     libmagickwand-dev \ | ||||||
|  |     mariadb-client | ||||||
|  |  | ||||||
|  | # Clear cache | ||||||
|  | RUN apt-get clean && rm -rf /var/lib/apt/lists/* | ||||||
|  |  | ||||||
|  | RUN pecl install imagick \ | ||||||
|  |     && docker-php-ext-enable imagick | ||||||
|  |  | ||||||
|  | # Install PHP extensions | ||||||
|  | RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gd | ||||||
|  |  | ||||||
|  | # Get latest Composer | ||||||
|  | COPY --from=composer:latest /usr/bin/composer /usr/bin/composer | ||||||
|  |  | ||||||
|  | # Create system user to run Composer and Artisan Commands | ||||||
|  | RUN useradd -G www-data,root -u 1000 -d /home/crater-user crater-user | ||||||
|  | RUN mkdir -p /home/crater-user/.composer && \ | ||||||
|  |     chown -R crater-user:crater-user /home/crater-user | ||||||
|  |  | ||||||
|  | # Mounted volumes | ||||||
|  | COPY ./ /var/www | ||||||
|  | COPY ./docker-compose/php/uploads.ini /usr/local/etc/php/conf.d/uploads.ini | ||||||
|  | COPY ./uffizzi/.env.example /var/www/.env | ||||||
|  |  | ||||||
|  | # Set working directory | ||||||
|  | WORKDIR /var/www | ||||||
|  |  | ||||||
|  | RUN chown -R crater-user:crater-user ./ | ||||||
|  | RUN chmod -R 775 composer.json composer.lock \  | ||||||
|  |         composer.lock storage/framework/ \ | ||||||
|  |         storage/logs/ bootstrap/cache/ /home/crater-user/.composer | ||||||
|  |  | ||||||
|  | RUN composer config --no-plugins allow-plugins.pestphp/pest-plugin true && \ | ||||||
|  |     composer install --no-interaction --prefer-dist --optimize-autoloader && \ | ||||||
|  |     php artisan storage:link || true && \ | ||||||
|  |     php artisan key:generate | ||||||
|  |  | ||||||
|  | FROM php:8.0-fpm-alpine | ||||||
|  |  | ||||||
|  | RUN apk add --no-cache \ | ||||||
|  |     php8-bcmath | ||||||
|  |  | ||||||
|  | RUN docker-php-ext-install pdo pdo_mysql bcmath | ||||||
|  |  | ||||||
|  | COPY docker-compose/crontab /etc/crontabs/root | ||||||
|  |  | ||||||
|  | # Mounted volumes | ||||||
|  | COPY --from=build /var/www /var/www | ||||||
|  |  | ||||||
|  | RUN chown -R $(whoami):$(whoami) /var/www/ | ||||||
|  | RUN chmod -R 775 /var/www/ | ||||||
|  | RUN chown -R $(whoami):$(whoami) /var/log/ | ||||||
|  | RUN chmod -R 775 /var/log/ | ||||||
|  |  | ||||||
|  | CMD ["crond", "-f"] | ||||||
							
								
								
									
										58
									
								
								uffizzi/docker-compose.uffizzi.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								uffizzi/docker-compose.uffizzi.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | version: '3' | ||||||
|  |  | ||||||
|  | x-uffizzi: | ||||||
|  |   ingress: | ||||||
|  |     service: nginx | ||||||
|  |     port: 80 | ||||||
|  |  | ||||||
|  | services: | ||||||
|  |   app: | ||||||
|  |     image: "${APP_IMAGE}" | ||||||
|  |     restart: unless-stopped | ||||||
|  |     working_dir: /var/www/ | ||||||
|  |     command: ["-c"," | ||||||
|  |             composer config --no-plugins allow-plugins.pestphp/pest-plugin true &&  | ||||||
|  |             composer install --no-interaction --prefer-dist --optimize-autoloader &&  | ||||||
|  |             php artisan storage:link || true &&  | ||||||
|  |             php artisan key:generate --force &&  | ||||||
|  |             php-fpm", | ||||||
|  |             ] | ||||||
|  |     entrypoint: /bin/sh | ||||||
|  |     depends_on: | ||||||
|  |       - db | ||||||
|  |     deploy: | ||||||
|  |       resources: | ||||||
|  |         limits: | ||||||
|  |           memory: 1000m | ||||||
|  |  | ||||||
|  |   db: | ||||||
|  |     image: mariadb | ||||||
|  |     restart: always | ||||||
|  |     environment: | ||||||
|  |       MYSQL_USER: crater | ||||||
|  |       MYSQL_PASSWORD: crater | ||||||
|  |       MYSQL_DATABASE: crater | ||||||
|  |       MYSQL_ROOT_PASSWORD: crater | ||||||
|  |     ports: | ||||||
|  |       - '33006:3306' | ||||||
|  |     deploy: | ||||||
|  |       resources: | ||||||
|  |         limits: | ||||||
|  |           memory: 500m | ||||||
|  |  | ||||||
|  |   nginx: | ||||||
|  |     image: "${NGINX_IMAGE}" | ||||||
|  |     restart: unless-stopped | ||||||
|  |     ports: | ||||||
|  |       - 80:80 | ||||||
|  |     depends_on: | ||||||
|  |       - app | ||||||
|  |     resources: | ||||||
|  |       limits: | ||||||
|  |         memory: 500m | ||||||
|  |  | ||||||
|  |   cron: | ||||||
|  |     image: "${CROND_IMAGE}" | ||||||
|  |     restart: always | ||||||
|  |      | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								uffizzi/nginx/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								uffizzi/nginx/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | ARG BASE_IMAGE | ||||||
|  |  | ||||||
|  | FROM $BASE_IMAGE as build | ||||||
|  | FROM nginx:1.17-alpine | ||||||
|  |  | ||||||
|  | RUN rm /etc/nginx/conf.d/default.conf | ||||||
|  |  | ||||||
|  | COPY --from=build /var/www /var/www | ||||||
|  | COPY ./uffizzi/nginx/nginx /etc/nginx/conf.d/ | ||||||
							
								
								
									
										22
									
								
								uffizzi/nginx/nginx/nginx.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								uffizzi/nginx/nginx/nginx.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | server { | ||||||
|  |     client_max_body_size 64M; | ||||||
|  |     listen 80; | ||||||
|  |     index index.php index.html; | ||||||
|  |     error_log  /var/log/nginx/error.log; | ||||||
|  |     access_log /var/log/nginx/access.log; | ||||||
|  |     root /var/www/public; | ||||||
|  |     location ~ \.php$ { | ||||||
|  |         try_files $uri =404; | ||||||
|  |         fastcgi_split_path_info ^(.+\.php)(/.+)$; | ||||||
|  |         fastcgi_pass localhost:9000; | ||||||
|  |         fastcgi_index index.php; | ||||||
|  |         include fastcgi_params; | ||||||
|  |         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | ||||||
|  |         fastcgi_param PATH_INFO $fastcgi_path_info; | ||||||
|  |         fastcgi_read_timeout 300; | ||||||
|  |     } | ||||||
|  |     location / { | ||||||
|  |         try_files $uri $uri/ /index.php?$query_string; | ||||||
|  |         gzip_static on; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	